const path = require('path');
const log4 = require('koa-log4');
const fs = require('fs');

const logDir = path.join(__dirname, 'logs');
try {
    // 创建日志目录
    fs.mkdirSync(logDir);
} catch (e) {
    if (e.code !== 'EEXIST') {
        console.error('Could not set up log directory, error was: ', e);
        process.exit(1)
    }
}
// 根据log 配置文件(log.json)配置日志文件
log4.configure(path.join(__dirname, 'log.json'), {cwd: logDir});

const errLog = log4.getLogger('err'); // 错误
const httpLog = log4.getLogger('http'); // 请求
const resLog = log4.getLogger('res'); // 响应
const allLog = log4.getLogger(); // 全部

class logs {
    all(info, time) {
        if (info) {
            allLog.info(formatInfo(info));
        }
    }
    http(ctx, time) {
        if (ctx) {
            httpLog.info(formatReqLog(ctx, time));
        }
    }
    reply(ctx, time) {
        if (ctx) {
            resLog.info(formatRes(ctx, time));
        }
    }
    err(ctx, error, time) {
        if (ctx && error) {
            errLog.error(formatError(ctx, error, time));
        }
    }
}

// 格式化响应日志
const formatRes = function (ctx, resTime) {
    let logText = '';
    // 响应日志开始
    logText += '\n' + '*************** response log start ***************' + '\n';

    // 添加请求日志
    logText += formatReqLog(ctx.request, resTime);

    // 响应状态码
    logText += 'response status: ' + ctx.status + '\n';

    // 响应内容
    logText += 'response body: ' + '\n' + JSON.stringify(ctx.body) + '\n';

    // 响应日志结束
    logText += '*************** response log end ***************' + '\n';

    return logText;
};

const formatInfo = function (info) {
    let logText = '';
    // 响应日志开始
    logText += '\n' + '***************info log start ***************' + '\n';

    // 响应内容
    logText += 'info detail: ' + '\n' + JSON.stringify(info) + '\n';

    // 响应日志结束
    logText += '*************** info log end ***************' + '\n';

    return logText;
};

// 格式化错误日志
const formatError = function (ctx, err, resTime) {
    let logText = '';

    // 错误信息开始
    logText += '\n' + '*************** error log start ***************' + '\n';

    // 添加请求日志
    logText += formatReqLog(ctx.request, resTime);

    // 错误名称
    logText += 'err name: ' + err.name + '\n';
    // 错误信息
    logText += 'err message: ' + err.message + '\n';
    // 错误详情
    logText += 'err stack: ' + err.stack + '\n';

    // 错误信息结束
    logText += '*************** error log end ***************' + '\n';

    return logText;
};

// 格式化请求日志
const formatReqLog = function (req, resTime) {
    let logText = '';

    let method = req.method;
    // 访问方法
    logText += '\n' + 'request method: ' + method + '\n';

    // 请求原始地址
    logText += 'request originalUrl:  ' + req.originalUrl + '\n';

    // 客户端ip
    logText += 'request client ip:  ' + req.ip + '\n';

    // 开始时间
    //   var startTime;
    // 请求参数
    if (method === 'GET') {
        logText += 'request query:  ' + JSON.stringify(req.query) + '\n';
        // startTime = req.query.requestStartTime;
    } else {
        logText += 'request body: ' + '\n' + JSON.stringify(req.body) + '\n';
        // startTime = req.body.requestStartTime;
    }
    // 服务器响应时间
    logText += 'response time: ' + resTime + 'ms' + '\n';

    return logText;
};

module.exports = () => {
    return async (ctx, next) => {
        ctx.logger = new logs();
        ctx.logger.http(ctx, 0);
        await next();
    };
};